#include <stdio.h>
#ifdef WIN32
#include <curses.h>
#else
#include <ncurses.h>
#endif
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include "src/Jeu.h"
#include "src/Terrain.h"

void ncursAff( WINDOW* win, const Jeu *Jeu)
{
	int x,y;
	int a;
	int b;

	Terrain *Ter = jeuGetCstTerrainPtr(Jeu);
	const Perso *Per = jeuGetCstPersoPtr(Jeu);

	wclear(win);

	for(y=0;y<Ter->dimY;++y)
		for(x=0;x<Ter->dimX;++x)
			mvwprintw( win, y, x, "%c",terrainGetCharCoord(Ter,y,x) );


	mvwprintw( win, getCoordYPerso(Per), getCoordXPerso(Per), "*");
	for (a=0; a<Jeu->nb_Zombie;a++)
	{
        mvwprintw( win, getCoordYZombie(getElementTabZombie(Jeu->tab_Zomb, a)), getCoordXZombie(getElementTabZombie(Jeu->tab_Zomb, a)), "@");
	}
//	if (Jeu->nb_Projectile > 0)
	//{
	    for (b=0; b<=Jeu->nb_Projectile;b++)
	{
        mvwprintw( win, getCoordYProjectile(getElementTabProjectile(Jeu->tab_Proj, b)), getCoordXProjectile(getElementTabProjectile(Jeu->tab_Proj, b)), "-");
	}
	//}
	mvwprintw( win, 0, 14, "%d",Jeu->score );


	zoneDeMort (Jeu->pers);
	mvwprintw( win, 0, 0, "%d", Jeu->pers->vie_Perso );


	wmove( win, getCoordXPerso(Per), getCoordXPerso(Per));

}
void ncursBoucle(Jeu *Jeu)
{
    printf("là 3-1\n");
	WINDOW *win, *screen;
	int c;

    int nb_alea;
    nb_alea = 0; // pour le choix du prochain terrain
	int compteurboucle; // varie de 0 à 4
	compteurboucle = 0;





	int continue_boucle;
	const Terrain *Ter = jeuGetCstTerrainPtr(Jeu);
	printf("là 3-2\n");
	printf(" %d \n", Ter->dimX);

	 /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /* Changer la valeur pour ralentir ou accélérer le déplacement des fantomes */
    float intervalle_horloge = 0.1f;
    printf("là 3-3\n");

	screen = initscr();		/* passe l'écran texte en mode NCurses */
	clear();		/* efface l'écran */
	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pasa à l'écran */
	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */



	/* Creation d'une nouvelle fenetre en mode texte */
	/* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
	win = newwin( Ter->dimY, Ter->dimX, 2, 2 );


	keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

	//halfdelay(temps_dizieme);

	/* notimeout(win,true); */
	/* wtimeout( win, 500 ); */
	nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */
//    mvwprintw( win, 4, 4, "lol");
	continue_boucle = 1;

	/* Récupère l'horloge actuelle et la convertit en secondes */
    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    ncursAff( win, Jeu);

	do
	{
        /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;

        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {

                ncursAff( win, Jeu);
                persovsZombie(Jeu);
                horloge_precedente = horloge_courante;

                if (Jeu->nb_Zombie <=5)
                    {
                       if ((int)horloge_courante %10 == 0)
                       {
                           ajouterZombie (Jeu);
                        }
                    }

            if ((int)(horloge_courante*10) %3 == 0)
            {
                 char * colonne;
                 colonne = malloc(15*sizeof(char));

                if (compteurboucle == 0)
                {
                    nb_alea = rand() % 4 +1 ;
                }

                switch (nb_alea)
                {

                case 1 : colonne = getcolonne(Jeu->Terrain1, compteurboucle);
                        break;
                case 2 : colonne = getcolonne(Jeu->Terrain2, compteurboucle);
                        break;
                case 3 : colonne = getcolonne(Jeu->Terrain3, compteurboucle);
                        break;
                case 4 : colonne = getcolonne(Jeu->Terrain4, compteurboucle);
                        break;

                }

                persovsZombie(Jeu);
                defilementTerrain (Jeu, colonne);



                if (compteurboucle == 4)
                {
                    compteurboucle=0;
                }
                else{compteurboucle = compteurboucle +1;}
            }


                persovsZombie(Jeu);

                if ((int)(horloge_courante*10) % 2 ==0 )
                {
                    evolutionZombie (Jeu);
                }


                if (Jeu->nb_Projectile >= 1)
                {
                    evolutionProjectile(Jeu);
                }

                persovsZombie(Jeu);
                if (Jeu->nb_Bonus == 0)
                {
                    if (Jeu->score %400 == 0)
                    {
                        spawnBonus(Jeu);
                    }
                }
                else
                {
                    persovsBonus(Jeu);
                }


                int nb;
                for (nb = 0 ; nb <Jeu->nb_Zombie ; nb++)
                {
                    if ( getVieZombie(getElementTabZombie(Jeu->tab_Zomb, nb)) == 0)
                    {
                        detruireZombie(Jeu->tab_Zomb, nb);
                        Jeu->nb_Zombie = Jeu->nb_Zombie -1 ;
                        Jeu->score = Jeu->score +100;
                    }
                }


                if (Jeu->pers->vie_Perso <= 0)
                {
                    exit (EXIT_FAILURE);
                }
                Jeu->score = Jeu->score + 10;
        }


   		c = wgetch(win);
		/* jeuActionClavier( jeu, 'd'); */
		switch(c)
		{
			case KEY_LEFT:
				jeuActionClavier( Jeu, 'g');
				ncursAff( win, Jeu);
				break;
			case KEY_RIGHT:
				jeuActionClavier( Jeu, 'd');
				ncursAff( win, Jeu);
				break;
			case KEY_UP:
				jeuActionClavier( Jeu, 'h');
				ncursAff( win, Jeu);
				break;
			case KEY_DOWN:
				jeuActionClavier( Jeu, 'b');
				ncursAff( win, Jeu);
				break;
            case 32:
               jeuActionClavier( Jeu, 'o');
               ncursAff( win, Jeu);
               break;
            case 27: /* ECHAP */
				continue_boucle = 0;
				break;

		}
	} while (continue_boucle==1);

    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

	endwin();
/*switch (c)
		{case 'g' :
				deplacementPersoGauche(Jeu->pers, Jeu->ter);
				break;
		case 'd' :
				deplacementPersoDroite(Jeu->pers,Jeu->ter);
				break;
		case 'h' :
				deplacementPersoHaut(Jeu->pers,Jeu->ter);
				break;
		case 'b' :
				deplacementPersoBas(Jeu->pers,Jeu->ter);
				break;
		}*/
}
